from itsdangerous import TimedJSONWebSignatureSerializer
from common.utils import const
from flask import current_app
from common.models.user import User

# 生成密钥
def generate(uid):
    '''
    根据已经登录之后的用户id。生成token
    :param uid:用户id
    :return:
    '''
    # 参数1：密钥 更加安全 参数2：token有效时间
    s = TimedJSONWebSignatureSerializer(secret_key=const.SECRET_KEY,expires_in=const.JWT_EXPIRY_SECOND)
    # 生成token dumps将python对象编码成JSON字符串；dump()将python中的对象转化成JSON存储在文件中
    return s.dumps({'id':uid}).decode()

def verify_tokens(token_str):
    '''
    验证token，并且验证成功后，返回用户ID
    :param token_str:
    :return:
    '''
    s = TimedJSONWebSignatureSerializer(secret_key=const.SECRET_KEY)
    try:
        # loads()将JSON字符串解码成python对象
        data = s.loads(token_str) # 本质上就是一个解密过程
    except Exception as e:
        current_app.logger.info(e)
        return {'message':'token 验证失败'}

    # 如果token验证成功，还需要看用户状态是否正常
    user = User.query.filter(User.id == data['id']).first()
    if user and user.status != 0:
        return {'message':'数据库中的用户状态过期'}
    return {'id':user.id}
